/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PrimKruskalOptimo.java
 *
 * Created on 11/11/2011, 12:35:58 AM
 */

package primkruskaloptimo;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**
 *
 * @author diego
 */
public class PrimKruskalOptimo extends javax.swing.JFrame {

    int matriz_aristas[][] = new int[0][0];
    private javax.swing.JTable jTable_Adyacencia = new javax.swing.JTable() {
       public Component prepareRenderer(TableCellRenderer renderer,
             int row, int column) {
          JLabel label = (JLabel) super.prepareRenderer(renderer, row, column);
          if (row == 0 || column == 0) {
             label.setBackground(new  Color(126, 234, 119));
          } else {
             label.setBackground(Color.WHITE);
          }
          return label;
       }};

    /** Creates new form PrimKruskalOptimo */
    public PrimKruskalOptimo() {
        initComponents();
        
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanelMetodo = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        jTextFieldNumVertices = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        jTabbedPaneMatrizAdyacenteResultados = new javax.swing.JTabbedPane();
        jPanelMatrizAdyacente = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jPanelResultados = new javax.swing.JPanel();
        jTextFieldSumaAristas = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jTextFieldRutaMinima = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jPanelMetodo1 = new javax.swing.JPanel();
        jComboBoxAlgoritmo = new javax.swing.JComboBox();
        jLabel5 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jToolBar1 = new javax.swing.JToolBar();
        jButtonEjecutarAlgoritmo = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Matematica Discreta DANC - Algoritmos para Arboles Generadores Minimos (PRIM y KRUSKAL)");
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanelMetodo.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jPanelMetodo.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel3.setFont(new java.awt.Font("Verdana", 0, 9));
        jLabel3.setForeground(new java.awt.Color(212, 39, 39));
        jLabel3.setText("(MAX. 30 vertices)");
        jPanelMetodo.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(290, 10, -1, 30));

        jTextFieldNumVertices.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                jTextFieldNumVerticesKeyReleased(evt);
            }
        });
        jPanelMetodo.add(jTextFieldNumVertices, new org.netbeans.lib.awtextra.AbsoluteConstraints(160, 10, 120, -1));

        jLabel8.setText("Numero de Vertices : ");
        jPanelMetodo.add(jLabel8, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, -1, 30));

        getContentPane().add(jPanelMetodo, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 100, 400, 50));

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanelMatrizAdyacente.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        jPanelMatrizAdyacente.add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, 740, 400));

        jTabbedPaneMatrizAdyacenteResultados.addTab("Matriz de Adyacencia", jPanelMatrizAdyacente);

        jPanelResultados.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jTextFieldSumaAristas.setEditable(false);
        jPanelResultados.add(jTextFieldSumaAristas, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 50, 100, -1));

        jLabel6.setText("Suma de Aristas : ");
        jPanelResultados.add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 50, -1, 30));

        jTextFieldRutaMinima.setEditable(false);
        jPanelResultados.add(jTextFieldRutaMinima, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 10, 520, -1));

        jLabel7.setText("Ruta Minima : ");
        jPanelResultados.add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 10, -1, 30));

        jTabbedPaneMatrizAdyacenteResultados.addTab("Resultados", jPanelResultados);

        jPanel1.add(jTabbedPaneMatrizAdyacenteResultados, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, 770, 460));

        getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 160, 790, 480));

        jPanelMetodo1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jPanelMetodo1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jComboBoxAlgoritmo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "PRIM", "KRUSKAL" }));
        jPanelMetodo1.add(jComboBoxAlgoritmo, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 10, 200, -1));

        jLabel5.setText("Seleccione Algoritmo : ");
        jPanelMetodo1.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, -1, 30));

        getContentPane().add(jPanelMetodo1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 100, 380, 50));

        jLabel4.setFont(new java.awt.Font("Verdana", 1, 14));
        jLabel4.setText("ALGORITMOS PARA ARBOLES GENERADORES MINIMOS (PRIM Y KRUSKAL)");
        getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 60, -1, -1));

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);

        jButtonEjecutarAlgoritmo.setText("Ejecutar Algoritmo");
        jButtonEjecutarAlgoritmo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonEjecutarAlgoritmoActionPerformed(evt);
            }
        });
        jToolBar1.add(jButtonEjecutarAlgoritmo);

        getContentPane().add(jToolBar1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 810, 40));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonEjecutarAlgoritmoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonEjecutarAlgoritmoActionPerformed
        Grafo cgrafo;

        if(matriz_aristas.length != 0)
        {
            for(int i = 0; i<matriz_aristas.length; i++)
            {
                for(int j = 0; j<matriz_aristas.length; j++)
                {
                    if(Integer.parseInt(jTable_Adyacencia.getValueAt(i+1, j+1).toString()) != 0)
                    {
                        System.out.println(Integer.parseInt(jTable_Adyacencia.getValueAt(i+1, j+1).toString()));
                        matriz_aristas[i][j] = Integer.parseInt(jTable_Adyacencia.getValueAt(i+1, j+1).toString());
                    }
                    else
                    {
                        matriz_aristas[i][j] = -123;
                    }

                }
            }

            cgrafo = new Grafo(matriz_aristas);

            if(!cgrafo.existeVerticeSinAristas())
            {
                if(jComboBoxAlgoritmo.getSelectedIndex() == 0)
                {
                    Prim cprim = new Prim(matriz_aristas, matriz_aristas.length);
                    cprim.ejecutarPrim();
                    jTextFieldSumaAristas.setText(String.valueOf(cprim.getSuma_aristas()));
                    jTextFieldRutaMinima.setText(String.valueOf(cprim.getCadena_ruta()));
                    jTabbedPaneMatrizAdyacenteResultados.setSelectedIndex(1);
                }
                else if(jComboBoxAlgoritmo.getSelectedIndex() == 1)
                {
                    Kruskal ckruskal = new Kruskal(matriz_aristas, matriz_aristas.length);
                    ckruskal.ejecutarKruskal();
                    jTextFieldSumaAristas.setText(String.valueOf(ckruskal.getSuma_aristas()));
                    jTextFieldRutaMinima.setText(String.valueOf(ckruskal.getCadena_ruta()));
                    jTabbedPaneMatrizAdyacenteResultados.setSelectedIndex(1);
                }
            }
            else
            {
                JOptionPane.showMessageDialog(this, "CADA VERTICE DEBE TENER POR LO MENOS UNA ARISTA");
            }
        }
        else
        {
            JOptionPane.showMessageDialog(this, "DEBE INGRESAR LA CANTIDAD DE VERTICES ANTES DE EJECUTAR EL ALGORITMO");
        }

        // TODO add your handling code here:
    }//GEN-LAST:event_jButtonEjecutarAlgoritmoActionPerformed

    private void jTextFieldNumVerticesKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldNumVerticesKeyReleased
        int numero_vertices = 0;
        try
        {
            if(jTextFieldNumVertices.getText().trim().length() != 0)
            {
                numero_vertices = Integer.parseInt(jTextFieldNumVertices.getText());
                if(numero_vertices <= 30 && numero_vertices >= 1) {
                    generarTablaAdyacencia(numero_vertices);
                    matriz_aristas = new int[numero_vertices][numero_vertices];
                    jTabbedPaneMatrizAdyacenteResultados.setSelectedIndex(0);
                } else {
                    JOptionPane.showMessageDialog(this, "EL MAXIMO NUMERO DE VERTICES ES 30");
                    jTextFieldNumVertices.setText("");
                }
                jTextFieldRutaMinima.setText("");
                jTextFieldSumaAristas.setText("");
            }
        } catch(Exception e) {
            JOptionPane.showMessageDialog(this, "DEBE INGRESAR UN NUMERO ENTERO");
            jTextFieldNumVertices.setText("");
            jTextFieldRutaMinima.setText("");
            jTextFieldSumaAristas.setText("");
        }
        // TODO add your handling code here:
    }//GEN-LAST:event_jTextFieldNumVerticesKeyReleased

    public void generarTablaAdyacencia(int numero_vertices)
    {
        ModeloTabla modelo_tabla = new ModeloTabla(numero_vertices);
        jTable_Adyacencia.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jTable_Adyacencia.setModel(modelo_tabla);
        jTable_Adyacencia.setRowHeight(30);

        TableColumnModel modeloColumna = jTable_Adyacencia.getColumnModel();
        TableColumn columnaTabla;
        for(int i = 0; i < jTable_Adyacencia.getRowCount(); i++)
        {
            columnaTabla = modeloColumna.getColumn(i);
            columnaTabla.setPreferredWidth(30);
        }
        jScrollPane1.setViewportView(jTable_Adyacencia);
        
    }


    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PrimKruskalOptimo().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonEjecutarAlgoritmo;
    private javax.swing.JComboBox jComboBoxAlgoritmo;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanelMatrizAdyacente;
    private javax.swing.JPanel jPanelMetodo;
    private javax.swing.JPanel jPanelMetodo1;
    private javax.swing.JPanel jPanelResultados;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTabbedPane jTabbedPaneMatrizAdyacenteResultados;
    private javax.swing.JTextField jTextFieldNumVertices;
    private javax.swing.JTextField jTextFieldRutaMinima;
    private javax.swing.JTextField jTextFieldSumaAristas;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration//GEN-END:variables

    /*
     * ESTA PARTE ES LA DATA PARA LAS PRUEBAS
     */
//    public static void main(String[] args) {
//        // TODO code application logic here
//        int num_vertices = 8;// AQUI SE GUARDA EL NUMERO DE VERTICES DEL GRAFO
//        int matriz_aristas[][] = new int [num_vertices][num_vertices];
 /*
 * ESTO ES PARA EL EJEMPLO 1
 */
//        matriz_aristas[0][0] = matriz_aristas[1][1] = matriz_aristas[2][2] = matriz_aristas[3][3] = matriz_aristas[4][4] = -123;
 /*
 * ESTO ES PARA EL EJEMPLO 2
 */
//        matriz_aristas[5][5] = matriz_aristas[6][6] = matriz_aristas[7][7] = -123;

//        matriz_aristas[8][8] = matriz_aristas[9][9] = -123;
//        matriz_aristas[10][10] = matriz_aristas[11][11] = -123;

/*
 * ESTO ES PARA EL EJEMPLO
 */
//        for(int i = 0; i < matriz_aristas.length; i++)
//        {
//            for(int j = 0; j< matriz_aristas.length; j++)
//            {
//
//                matriz_aristas[j][i] = matriz_aristas[i][j] = -123;
//            }
//        }
/*
 * ESTO ES PARA EL EJEMPLO 1
 */
//        matriz_aristas[0][1] = matriz_aristas[1][0] = 12;
//        matriz_aristas[0][2] = matriz_aristas[2][0] = 9;
//        matriz_aristas[0][3] = matriz_aristas[3][0] = 22;
//        matriz_aristas[0][4] = matriz_aristas[4][0] = 20;
//        matriz_aristas[2][1] = matriz_aristas[1][2] = 12;
//        matriz_aristas[3][1] = matriz_aristas[1][3] = 7;
//        matriz_aristas[4][1] = matriz_aristas[1][4] = 10;
//        matriz_aristas[3][2] = matriz_aristas[2][3] = 14;
//        matriz_aristas[4][2] = matriz_aristas[2][4] = 16;
//        matriz_aristas[4][3] = matriz_aristas[3][4] = 8;

//        matriz_aristas[0][1] = matriz_aristas[1][0] = 2;
//        matriz_aristas[1][2] = matriz_aristas[2][1] = 3;
//        matriz_aristas[2][3] = matriz_aristas[3][2] = 1;
//        matriz_aristas[4][0] = matriz_aristas[0][4] = 3;
//        matriz_aristas[5][1] = matriz_aristas[1][5] = 1;
//        matriz_aristas[5][4] = matriz_aristas[4][5] = 4;
//        matriz_aristas[6][2] = matriz_aristas[2][6] = 2;
//        matriz_aristas[6][5] = matriz_aristas[5][6] = 3;
//        matriz_aristas[7][3] = matriz_aristas[3][7] = 5;
//        matriz_aristas[7][6] = matriz_aristas[6][7] = 3;
//        matriz_aristas[8][4] = matriz_aristas[4][8] = 4;
//        matriz_aristas[9][5] = matriz_aristas[5][9] = 2;
//        matriz_aristas[9][8] = matriz_aristas[8][9] = 3;
//        matriz_aristas[10][6] = matriz_aristas[6][10] = 4;
//        matriz_aristas[10][9] = matriz_aristas[9][10] = 3;
//        matriz_aristas[11][7] = matriz_aristas[7][11] = 3;
//        matriz_aristas[11][10] = matriz_aristas[10][11] = 1;

//        matriz_aristas[2][0] = matriz_aristas[0][2] = 26;
//        matriz_aristas[2][1] = matriz_aristas[1][2] = 36;
//        matriz_aristas[3][1] = matriz_aristas[1][3] = 29;
//        matriz_aristas[3][2] = matriz_aristas[2][3] = 17;
//        matriz_aristas[4][0] = matriz_aristas[0][4] = 38;
//        matriz_aristas[5][1] = matriz_aristas[1][5] = 32;
//        matriz_aristas[5][4] = matriz_aristas[4][5] = 35;
//        matriz_aristas[6][0] = matriz_aristas[0][6] = 58;
//        matriz_aristas[6][2] = matriz_aristas[2][6] = 40;
//        matriz_aristas[6][3] = matriz_aristas[3][6] = 52;
//        matriz_aristas[6][4] = matriz_aristas[4][6] = 93;
//        matriz_aristas[7][0] = matriz_aristas[0][7] = 16;
//        matriz_aristas[7][1] = matriz_aristas[1][7] = 19;
//        matriz_aristas[7][2] = matriz_aristas[2][7] = 34;
//        matriz_aristas[7][4] = matriz_aristas[4][7] = 37;
//        matriz_aristas[7][5] = matriz_aristas[5][7] = 28;

//        Prim cprim = new Prim(matriz_aristas, num_vertices);
//        cprim.ejecutarPrim();
//        Kruskal ckruskal = new Kruskal(matriz_aristas, num_vertices);
//        ckruskal.ejecutarKruskal();
//    }
}
